package top.hudk.tank.utils;

import top.hudk.tank.enums.Dir;

/**
 * 作用：坦克方向工具类
 *
 * @author hudk
 * @date 2020/9/9 22:31
 */
public class DirUtil {

    private static final int NUMB = 1000;

    private static final int ONE = 1;

    public static Dir randomDir(){
        return Dir.values()[RandomUtil.randomInt(Dir.values().length)];
    }

    /**
     * 按照一定概率发生改变方向事件，
     * 若事件发生，转向四个方向都有可能
     * @param dir
     * @param dirProbability
     */
    public static Dir randomDir(Dir dir, double dirProbability){
        Dir d = dir;
        if(RandomUtil.randomInt(NUMB) > NUMB * (ONE-dirProbability)){
            d = randomDir();
        }
        return d;
    }

    /**
     * 按照一定概率发生改变方向事件，
     * 若事件发生，向左转或者向右转
     * @param dir
     * @param dirProbability
     */
    public static Dir randomLeftOrRightDir(Dir dir, double dirProbability){
        Dir d = dir;
        boolean isTurn = RandomUtil.randomInt(NUMB) > NUMB * (ONE-dirProbability);
        randomLeftOrRightDir(dir, isTurn);
        return d;
    }

    /**
     * 按照一定概率发生改变方向事件，
     * 若事件发生，向左转或者向右转
     * @param dir 方向
     * @param isTurn 是否转向
     */
    public static Dir randomLeftOrRightDir(Dir dir, boolean isTurn){
        Dir d = dir;
        if(isTurn){
            d = randomLeftOrRightDir(dir);
        }
        return d;
    }

    /**
     * 按照一定概率发生改变方向事件，
     * 若事件发生，向左转或者向右转
     * @param dir
     */
    public static Dir boundsRandomLeftOrRightDir(Dir dir){
        return randomLeftOrRightDir(dir,0.1);
    }

    /**
     * 当前方向随机向右转或者向左转
     *
     * 0 代表方向左
     * 1 代表方向上
     * 2 代表方向右
     * 3 代表方向下
     * 本方法实现：
     * 输入 ->  输出
     * 0   ->  f([3,1])
     * 1   ->  f([0,2])
     * 2   ->  f([1,3])
     * 3   ->  f([2,0])
     *
     * f([2,0]) 表示随机从[2,0]中取一个数返回
     *
     * @param dir 返回一个方向枚举
     */
    public static Dir randomLeftOrRightDir(Dir dir){
        int driIndex = getDriIndex(dir);
        int l = ((driIndex + 3) % 4);
        int r = ((driIndex + 5) % 4);
        Dir[] dirs = Dir.values();
        int i = RandomUtil.randomInt(2);
        if(i == 0){
            return dirs[l];
        }
        return dirs[r];
    }

//    /**
//     * 当前方向随机向右转或者向左转
//     * @param dir
//     */
//    public static Dir turnRightDir(Dir dir){
//        int index = getDriIndex(dir);
//        int l = 0,r = 0;
//        Dir[] dirs = Dir.values();
//        if(index + 1 == dirs.length){
//            r = 0;
//        }else{
//            r = index + 1;
//        }
//        if(index == 0){
//            r = 3;
//        }else{
//            r = index - 1;
//        }
//        int i = RandomUtil.randomInt(2);
//        if(i == 0){
//            return dirs[l];
//        }
//        return dirs[r];
//
//    }

    public static int getDriIndex(Dir dir){
        int i = 0;
        for(; i < Dir.values().length; i ++){
            if (Dir.values()[i].equals(dir)) {
                break;
            }
        }
        return i;
    }

    public static Dir getNegativeDir(Dir dir){
        if(Dir.LEFT.equals(dir)){
            return Dir.RIGHT;
        }
        if(Dir.RIGHT.equals(dir)){
            return Dir.LEFT;
        }
        if(Dir.UP.equals(dir)){
            return Dir.DOWN;
        }
        if(Dir.DOWN.equals(dir)){
            return Dir.UP;
        }
        return null;
    }

}
